
import config from './config.js'

// 封装 uni.request 返回Promise对象
// 默认错误码弹框提示, 此时外部可以只补充 then();
// 如果希望由外部调用来处理错误码, 则参数 autoErrToast 应传入false, 同时在外部补充 catch()

// 使用举例
  // var self = this
  // utils.showLoading('加载中', true, 1000, 5000) 
  // http.post('apis/user/coupon/info', {user_id:userId}).then( data=>{
  // 	utils.hideLoading() 
  
  // })
  // .catch((err)=>{
  // 	utils.hideLoading() 
  // })


function get(url, jsonData, autoErrToast=true) {
  console.log('####### http get 发送:' + config.baseUrl + url) 
  
  return new Promise((resolve, reject) => {
    uni.request({
      url: config.baseUrl + url, 
      method:'GET', 
      data: jsonData,
      header:{
        'Content-Type': 'application/json',
        'X-Client-Type': 'android',
        'Authorization': 'Bearer ' + (getApp().globalData.token || '')//服务端采用jwt验证机制
      },
      success(res) { 
        console.log('####### http get 响应:' + JSON.stringify(res.data)) 
        
        if (res.data.code == 200) {
          resolve(res.data.data) 
        } else {
          if (autoErrToast) {
            let tips = res.data.message || res.data.errmsg || '请求失败'
            uni.showToast({title: tips, icon:'none'}) 
            //处理通用错误码
            if (handleErrorCode(res.data.code, tips)) { 
              return 
            }
          }
          reject(res.data) 
        }
      },
      fail(err) {
        console.log('####### http get 失败:' + err) 
        uni.showToast({title: '请求失败，请检查网络', icon:'none'}) 
        reject(err) 
      }
    }) 
  })
} 

function post(url, jsonData, autoErrToast=true) { 
  console.log('####### http post 发送:' + config.baseUrl + url + ', 参数: ' + JSON.stringify(jsonData)) 
  
  return new Promise((resolve, reject) => {
    uni.request({
      url: config.baseUrl + url, 
      header:{
        'Content-Type': 'application/json',
        'X-Client-Type': 'android',
        'Authorization': 'Bearer ' + (getApp().globalData.token || '')//服务端采用jwt验证机制
      },
      method:'POST', 
      timeout: 8000,
      data:jsonData, 
      success(res) { 
        let str = JSON.stringify(res.data) 
        console.log('####### http post 响应:' + (str.length < 20480 ? str : '大量数据(略), len: '+str.length)) 
        if (res.data.code == 200) {
          // if (res.data.data.jwt) {
          // 	getApp().globalData.jwtToken = res.data.data.jwt 
          // }
          resolve(res.data.data) 
        } else { 
          if (autoErrToast) {
            let tips = res.data.message || res.data.errmsg || '请求失败'
            uni.showToast({title: tips, icon:'none'}) 
            //处理通用错误码
            if (handleErrorCode(res.data.code, tips)) { 
              return 
            } 
          } 
          reject(res.data) 
        } 
      },
      fail(err) {
        console.log('####### http post 失败:' + err) 
        if (autoErrToast) {
          uni.showToast({title: '请求失败，请检查网络', icon:'none'})
        } 
        reject(err) 
      }
    }) 
  })
}

// 处理通用错误码 (在 game-mode.js处理) 
function handleErrorCode(code, errMsg) { 
  let event = '' 
  switch(code) { 
    case 10011: //请先登录 
      event = 'goto_login' 
      errMsg = '请先登录' 
      break 
  } 
  if (event != '') { 
    console.log('=== 处理通用错误码:', code) 
    uni.$emit('common_event', event, errMsg) 
    return true 
  } 
  return false 
} 

export default {
  get, 
  post,
}
